#include <iostream>
using namespace std;
#define MAXSIZE 10

typedef int ElemType;

// 顺序栈
struct SqStack {
    ElemType * base;        // 栈底
    ElemType * top;         // 栈顶
    int stacksize;
};

bool InitStack(SqStack &S)
{
    S.base = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE);
    if (!S.base)
        return false;
    S.top = S.base;
    S.stacksize = MAXSIZE;
    return true;
}

bool Push(SqStack &S, ElemType &e)
{
    if (S.top-S.base == S.stacksize)       // 栈满
        return false;
    *(S.top) = e;
    ++(S.top);
    return true;
}

bool IsEmpty(SqStack &S)
{
    if (S.base == S.top)
        return true;
    else
        return false;
}

bool Pop(SqStack &S, ElemType &e)
{
    if (!IsEmpty(S))
        return false;
    --(S.top);
    e = *(S.top);
    return true;
}

// 获取栈的长度
int StackLength(SqStack &S)
{
    return (S.top - S.base);
}

// 创建一个栈
bool CreateStack(SqStack &S, int n)
{
    for (int i = 0; i < n; i++)
    {
        ElemType input;
        cin >> input;
        if (!Push(S, input))
        {
            cout << "error happend at - " << i << endl;
            return false;
        }
    }
    return true;
}

// 清空顺序栈
bool ClearStact(SqStack &S)
{
    if (S.base) {
        S.top  = S.base;
        return true;
    } else {
        return false;
    }
}

// 销毁顺序栈
void DestoyStack(SqStack &S)
{
    if (S.base)
    {
        free(S.base);
        S.stacksize = 0;
        S.base = S.top = NULL;
    }
}

int main(void)
{
    SqStack S;
    int len;

    InitStack(S);
    
    CreateStack(S, 5);
    len = StackLength(S);
    cout << "栈的长度是 " << len << endl;
    return 0;

}